package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gen"
	"gorm.io/gen/field"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
)

func main() {
	// 数据库配置
	dsn := "root:root@tcp(127.0.0.1:3306)/aiMate?charset=utf8mb4&parseTime=true&loc=Local"

	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			SingularTable: false, // 表名复数
		},
	})
	if err != nil {
		panic("failed to connect to DB: " + err.Error())
	}

	// 创建 gen 实例
	g := gen.NewGenerator(gen.Config{
		OutPath:           "./internal/dao/query", // 输出路径
		ModelPkgPath:      "model",                // model 包名
		FieldNullable:     false,                  // 是否标记字段为可 null
		FieldWithIndexTag: true,                   // 是否生成索引 tag
		FieldWithTypeTag:  true,                   // 是否生成字段类型 tag
	})

	// 使用数据库连接
	g.UseDB(db)

	// 设置时间字段为 time.Time (建议使用非指针类型)
	g.WithDataTypeMap(map[string]func(gorm.ColumnType) string{
		"datetime":  func(gorm.ColumnType) string { return "*time.Time" },
		"timestamp": func(gorm.ColumnType) string { return "*time.Time" },
		"date":      func(gorm.ColumnType) string { return "*time.Time" },
	})

	g.WithOpts(gen.ModelOpt(
		gen.FieldGORMTagReg("create_time", func(tag field.GormTag) field.GormTag {
			return tag.Append("autoCreateTime")
		}),
	))
	g.WithOpts(gen.ModelOpt(
		gen.FieldGORMTagReg("update_time", func(tag field.GormTag) field.GormTag {
			return tag.Append("autoUpdateTime")
		}),
	))

	// 生成所有表的 Model
	models := g.GenerateAllTable()
	// 应用生成 Query 结构体及方法
	g.ApplyBasic(models...)

	// 执行生成
	g.Execute()
}
